﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;
using ElevenGlobal;

namespace ElevenGUI
{
    public partial class GLOBuscador : Form
    {
        private int _Entidad;
        private DataTable dtClientes;
        private DataTable dtProveedores;
        private DataTable dtFacturas;
        private DataTable dtOrdenes;

        public enum Entidades
        {
            Clientes = 0,
            Proveedor,
            Producto,
            Factura,
            Orden,
            OrdenProd,
            OrdenProv,
            FacProd,
            FacCliente,
            PrecProd,
            PerdProd
        }

        public int Entidad
        {
            get { return _Entidad; }
            set
            {
                if ((value == (int)Entidades.Clientes) 
                    || (value == (int)Entidades.Producto) 
                    || (value == (int)Entidades.Proveedor) 
                    || (value == (int)Entidades.Factura)
                    || (value == (int)Entidades.Orden)
                    || (value == (int)Entidades.OrdenProd)
                    || (value == (int)Entidades.OrdenProv)
                    || (value == (int)Entidades.FacProd)
                    || (value == (int)Entidades.FacCliente)
                    || (value == (int)Entidades.PrecProd)
                    || (value == (int)Entidades.PerdProd)
                    )
                {
                    _Entidad = value;
                }
                else
                {
                    throw new ValidadorException("Entidad (Módulo) no soportado aún.");
                }
            }
        }

        public GLOBuscador()
        {
            InitializeComponent();
        }

        #region Carga de Datos

        private void GLOBuscador_Load(object sender, EventArgs e)
        {
            
            switch (this.Entidad)
            {
                case (int)Entidades.Clientes:
                    this.Text = "Buscar Clientes";
                    string[] cols1 = { "Nombre", "Primer Apellido", "Segundo Apellido" };
                    agregarColumnasCombo(cols1);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasCliente();
                    break;
                case (int)Entidades.Proveedor:
                    this.Text = "Buscar Proveedores";
                    string[] cols2 = { "Nombre", "Dirección", "Cédula Jurídica", "Correo Electrónico", "Teléfono", "Fax", "ID" };
                    agregarColumnasCombo(cols2);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasProveedor();
                    break;
                case (int)Entidades.Producto:
                    this.Text = "Buscar Productos";
                    string[] cols3 = { "Nombre", "Descripcion", "Categoría", "Subcategoría", "Código", "Código de Barras" };
                    agregarColumnasCombo(cols3);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasProducto();
                    break;
                case (int)Entidades.Factura:
                    this.Text = "Buscar Facturas del";
                    mostrarElegirFecha();
                    eliminarDatos();
                    agregarColumnasFactura();
                    break;
                case (int)Entidades.Orden:
                    this.Text = "Buscar Órdenes del";
                    mostrarElegirFecha();
                    eliminarDatos();
                    agregarColumnasOrden();
                    break;
                case (int)Entidades.OrdenProd:
                    this.Text = "Buscar Productos";
                    string[] cols4 = { "Nombre", "Descripcion", "Categoría", "Subcategoría", "Código", "Código de Barras" };
                    agregarColumnasCombo(cols4);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasProducto();
                    break;
                case (int)Entidades.OrdenProv:
                    this.Text = "Buscar Proveedores";
                    string[] cols5 = { "Nombre", "Dirección", "Cédula Jurídica", "Correo Electrónico", "Teléfono", "Fax", "ID" };
                    agregarColumnasCombo(cols5);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasProveedor();
                    break;
                case (int)Entidades.FacProd:
                    this.Text = "Buscar Productos";
                    string[] cols6 = { "Nombre", "Descripcion", "Categoría", "Subcategoría", "Código", "Código de Barras" };
                    agregarColumnasCombo(cols6);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasProducto();
                    break;
                case (int)Entidades.FacCliente:
                    this.Text = "Buscar Clientes";
                    string[] cols7 = { "Nombre", "Primer Apellido", "Segundo Apellido" };
                    agregarColumnasCombo(cols7);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasCliente();
                    break;
                case (int)Entidades.PrecProd:
                    this.Text = "Buscar Productos";
                    string[] cols8 = { "Nombre", "Descripcion", "Categoría", "Subcategoría", "Código", "Código de Barras" };
                    agregarColumnasCombo(cols8);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasProducto();
                    break;
                case (int)Entidades.PerdProd:
                    this.Text = "Buscar Productos";
                    string[] cols9 = { "Nombre", "Descripcion", "Categoría", "Subcategoría", "Código", "Código de Barras" };
                    agregarColumnasCombo(cols9);
                    cbBuscarPor.SelectedIndex = 0;
                    eliminarDatos();
                    agregarColumnasProducto();
                    break;
            }
        }

        private void agregarColumnasCombo(string[] cols) { 
            foreach(string col in cols){
                cbBuscarPor.Items.Add(col);
            }
        }

        private void eliminarDatos()
        {
            dgvResultado.Rows.Clear();
            dgvResultado.Columns.Clear();
        }

        private void mostrarElegirFecha() {
            cbBuscarPor.Visible = false;
            txtPalabraClave.Visible = false;
            dtpFecha.Visible = true;
        }

        #endregion

        #region Carga de Datos DataGrid

        private void agregarColumnasCliente()
        {
            string[] cols = {"ID", "Cédula", "Primer Apellido", "Segundo Apellido", "Nombre", "Dirección"
                                , "Región", "Teléfono 1", "Teléfono 2", "Celular", "Correo"};
            int[] ancho = {50, 100, 150, 150, 150, 250
                              , 250, 100, 100, 100, 200};
            agregarColumnasDataGrid(cols, ancho);
        }

        private void agregarColumnasProveedor()
        {
            string[] cols = {"ID", "Cédula Jurídica", "Nombre", "Nombre Jurídico", "Dirección", "Region"
                            , "Teléfono", "Teléfono 2", "Fax", "Correo Electrónico", "Sitio Web"};
            int[] ancho = {150, 150, 150, 150, 150, 250
                              , 250, 250, 150, 150, 150};
            agregarColumnasDataGrid(cols, ancho);
        }

        private void agregarColumnasProducto()
        {
            string[] cols = {"Código", "Código de Barras", "Nombre", "Descripción"
                                , "Categoría", "Subcategoría", "Cantidad"};
            int[] ancho = {150, 150, 150, 250
                              , 150, 150, 100};
            agregarColumnasDataGrid(cols, ancho);
        }

        private void agregarColumnasFactura()
        {
            string[] cols = {"Número de factura", "Fecha"};
            int[] ancho = {150, 250};
            agregarColumnasDataGrid(cols, ancho);
        }

        private void agregarColumnasOrden()
        {
            string[] cols = { "Número de orden", "Fecha" };
            int[] ancho = { 150, 250 };
            agregarColumnasDataGrid(cols, ancho);
        }

        private void agregarColumnasDataGrid(string[] cols, int[] ancho)
        {
            int k = 0;
            if (cols.Length < ancho.Length)
            {
                k = cols.Length;
            }
            else if (ancho.Length < cols.Length)
            {
                k = ancho.Length;
            }
            else
            {
                k = ancho.Length;
            }
            DataGridViewTextBoxColumn dgcol;
            for (int i = 0; i < k; i++)
            {
                dgcol = new DataGridViewTextBoxColumn();
                dgcol.HeaderText = cols[i];
                dgcol.Width = ancho[i];
                dgvResultado.Columns.Add(dgcol);
            }
        }

        #endregion

        #region Consultas 

        private void consultar()
        {
            try
            {
                dgvResultado.Rows.Clear();
                switch (this.Entidad)
                {
                    case (int)GLOBuscador.Entidades.Clientes:
                        consultarClientes();
                        break;
                    case (int)GLOBuscador.Entidades.Proveedor:
                        consultarProveedores();
                        break;
                    case (int)GLOBuscador.Entidades.Producto:
                        consultarProducto();
                        break;
                    case (int)GLOBuscador.Entidades.Factura:
                        consultarFacturaFecha();
                        break;
                    case (int)GLOBuscador.Entidades.Orden:
                        consultarOrdenFecha();
                        break;
                    case (int)GLOBuscador.Entidades.OrdenProd:
                        consultarProducto();
                        break;
                    case (int)GLOBuscador.Entidades.OrdenProv:
                        consultarProveedores();
                        break;
                    case (int)GLOBuscador.Entidades.FacProd:
                        consultarProducto();
                        break;
                    case (int)GLOBuscador.Entidades.FacCliente:
                        consultarClientes();
                        break;
                    case (int)GLOBuscador.Entidades.PrecProd:
                        consultarProducto();
                        break;
                    case (int)GLOBuscador.Entidades.PerdProd:
                        consultarProducto();
                        break;
                }
            }
            catch (NullReferenceException) { }
        }

        private void consultarClientes() {
            string Columna = "";
            switch (cbBuscarPor.SelectedIndex)
            {
                case 0:
                    Columna = "Nombre";
                    break;
                case 1:
                    Columna = "Apellido1";
                    break;
                case 2:
                    Columna = "Apellido2";
                    break;
            }
            dtClientes = POSCliente.consultarLike(Columna, txtPalabraClave.Text);
            foreach (DataRow dr in dtClientes.Rows)
            {
                dgvResultado.Rows.Add(dr["IdCliente"], dr["Cedula"], dr["Apellido1"], dr["Apellido2"], dr["Nombre"]
                    , dr["Direccion"], dr["Region"], dr["Telefono"], dr["Telefono2"], dr["Celular"], dr["Correo"]);
            }
        }

        private void consultarProveedores() {
            string Columna = "";
            switch (cbBuscarPor.SelectedIndex)
            {
                case 0:
                    Columna = "Nombre";
                    break;
                case 1:
                    Columna = "Direccion";
                    break;
                case 2:
                    Columna = "CedJuridica";
                    break;
                case 3:
                    Columna = "Correo";
                    break;
                case 4:
                    Columna = "Telefono";
                    break;
                case 5:
                    Columna = "Fax";
                    break;
                case 6:
                    Columna = "IdProveedor";
                    break;
            }
            dtProveedores = SCMProveedor.consultarLike(Columna, txtPalabraClave.Text);
            foreach (DataRow dr in dtProveedores.Rows)
            {
                dgvResultado.Rows.Add(dr["IdProveedor"], dr["CedJuridica"], dr["Nombre"], dr["NombreJuridico"], dr["Direccion"], dr["Region"]
                    , dr["Telefono"], dr["Telefono2"], dr["Fax"], dr["Correo"], dr["SitioWeb"]);
            }
        }

        private void consultarProducto() {
            string Columna = "";
            switch (cbBuscarPor.SelectedIndex)
            {
                case 0:
                    Columna = "Nombre";
                    break;
                case 1:
                    Columna = "Descripcion";
                    break;
                case 2:
                    Columna = "Categoria";
                    break;
                case 3:
                    Columna = "Subcategoria";
                    break;
                case 4:
                    Columna = "IdProducto";
                    break;
                case 5:
                    Columna = "IdCodigoBarras";
                    break;
            }
            dtProveedores = SCMProducto.consultarLike(Columna, txtPalabraClave.Text);
            foreach (DataRow dr in dtProveedores.Rows)
            {
                dgvResultado.Rows.Add(dr["IdProducto"], dr["IdCodigoBarras"], dr["Nombre"], dr["Descripcion"], dr["Categoria"]
                    , dr["Subcategoria"], dr["Cantidad"]);
            }
        }

        private void consultarFacturaFecha() {
            dtFacturas = POSFactura.consultar(dtpFecha.Value);
            foreach (DataRow dr in dtFacturas.Rows)
            {
                dgvResultado.Rows.Add(dr["IdFactura"], dr["Fecha"]);
            }
        }

        private void consultarOrdenFecha() {
            dtOrdenes = SCMOrdenCompra.consultarXFecha(dtpFecha.Value);
            foreach (DataRow dr in dtOrdenes.Rows)
            {
                dgvResultado.Rows.Add(dr["IdOrdenCompra"], dr["Fecha"]);
            }
        }

        #endregion

        #region Eventos Controles

        private void btnElegir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txtPalabraClave_TextChanged(object sender, EventArgs e)
        {
            consultar();
        }

        private void GLOBuscador_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                switch (this.Entidad)
                {
                    case (int)GLOBuscador.Entidades.Clientes:
                        Cache.cliente = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.Producto:
                        Cache.producto = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.Proveedor:
                        Cache.proveedor = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.Factura:
                        Cache.factura = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.Orden:
                        Cache.orden = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.OrdenProd:
                        Cache.ordproducto = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.OrdenProv:
                        Cache.ordproveedor = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.FacProd:
                        Cache.facproducto = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.FacCliente:
                        Cache.faccliente = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.PrecProd:
                        Cache.pvenproducto = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                    case (int)GLOBuscador.Entidades.PerdProd:
                        Cache.perproducto = dgvResultado.Rows[dgvResultado.SelectedCells[0].RowIndex];
                        break;
                }
            }
            catch (ArgumentOutOfRangeException) { }
        }

        private void dgvResultado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            this.Close();
        }

        private void dtpFecha_ValueChanged(object sender, EventArgs e)
        {
            consultar();
        }

        #endregion

    }
}
